package com.design.patterns.list.templatemethod;

/**
 * @author Wangzhiwen
 */
public abstract class AbstractTemplate {

    // 不同的实现，但都是一样的步骤流程
    protected void stepOne(){
        System.out.println("通用的第一步");
    }
    protected abstract void stepTwo();
    protected void stepThree(){
        System.out.println("通用的第三步");
    }
    protected abstract void stepFour();

    // 钩子方法，规定一个默认的行为。子类可以决定是否重写，可以通过钩子方法决定某一步骤是否执行或之类
    protected boolean hookMethod(){
        return true;
    }

    // 延迟到子类具体实现，加上final不让子类去覆盖
    final protected void make(){
        stepOne();
        stepTwo();
        stepThree();
        stepFour();
    }
}
